/**
 * 提供等待时间、事件方法的对象
 */
const WaitUtil = {
    /**
     * 等待
     * @param {*} millisecond 
     * @returns 
     */
    wait(millisecond) {
        return new Promise(resolve => setTimeout(resolve, millisecond));
    },

    /**
     * 等待某条件成真
     * @param {function} testCondition 检测条件方法，当它返回true时，就不再等待
     * @param {number} checkIntervalMs 轮询间隔
     * @param {number} maxWaitCount - 最大等待次数，默认无限等待
     * @returns {Promise<boolean>} 返回true表示条件满足，false表示超时
     * @returns Promise
     */
    waitUntil(testCondition, checkIntervalMs, maxWaitCount = Infinity) {
        return new Promise(resolve => {
            let count = 0;
            let id = setInterval(() => {
                count++;
                if (testCondition()) {
                    clearInterval(id);
                    resolve(true);
                } else if (count >= maxWaitCount) {
                    clearInterval(id);
                    resolve(false);
                }
            }, checkIntervalMs);
        });
    },
    /**
     * 带超时控制的异步任务执行器
     * @param {Promise} taskPromise - 代表异步任务的Promise
     * @param {number} timeoutMs - 最大等待时间（毫秒）
     * @param {*} [defaultValue=null] - 超时后返回的默认值
     * @returns {Promise} 返回最先完成的 Promise：
     *                    - 如果任务在超时前完成，返回任务结果
     *                    - 如果超时先触发，返回默认值
     */
    waitAtMost(taskPromise, timeoutMs, defaultValue = null) {
        // 创建超时 Promise，在指定时间后 resolve 默认值
        const timeoutPromise = new Promise((resolve) => {
            setTimeout(() => resolve(defaultValue), timeoutMs);
        });
        // 使用 Promise.race 竞速执行任务和超时
        return Promise.race([timeoutPromise, taskPromise]);
    },
    requireManualInput(tip, checkInputFunction, actionFunction) {
        let input;
        for (; !checkInputFunction((input = prompt(tip)));) { }
        actionFunction(input);
    },
};

// 导出WaitUtil对象
module.exports = WaitUtil;